package cn.itsource.pethome.service.impl;

import cn.itsource.pethome.Util.FastdfsUtil;
import cn.itsource.pethome.Util.MyTools;
import cn.itsource.pethome.constants.BaseConstants;
import cn.itsource.pethome.result.JSONResult;
import cn.itsource.pethome.service.IFileService;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Service
public class FileServiceImpl implements IFileService {

    //读取配置中的fastdfs文件服务器地址
    @Value("${pethome.fastdfs.baseurl}")
    private String fastdfsUrl;

    @Override
    public JSONResult upload2Fastdfs(MultipartFile file) {
        //扩展名
        String extension = FilenameUtils.getExtension(file.getOriginalFilename());
        try {
            String filePath = FastdfsUtil.upload(file.getBytes(), extension);
            System.out.println("接口文件上传成功，文件服务器 - 返回路径：" + filePath);
            //拼接完整的URL
            filePath = fastdfsUrl+filePath;
            return JSONResult.success(filePath);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return JSONResult.error("上传失败");
    }
    @Override
    public JSONResult fileUpload(MultipartFile file) {
        System.out.println("上传文件类型" + file.getContentType());
        System.out.println("上传文件大小" + file.getSize());//单位：字节

        //1、文件大小校验
        if(!MyTools.checkFileSize(file.getSize(), 1024*1024, "m")){
            return JSONResult.error("文件大小超出限制");
        }

        //2、文件类型校验
        ArrayList<String> strings = new ArrayList<>();
        strings.add("image/png");
        strings.add("image/jpg");
        strings.add("image/gif");
        strings.add("image/jpeg");
        if (!strings.contains(file.getContentType())){
            return JSONResult.error("文件类型错误");
        }

        //3、开始上传文件
        try {
            //获取文件名
            String fileName = file.getOriginalFilename();//123.jpg
            //获取文件类型
            String fileType = fileName.substring(fileName.lastIndexOf("."));//.jpg
            //UUID随机码
            String uuid = UUID.randomUUID().toString().replace("-","");//x2d2f5fd52dv2dv5df555df8322
            //文件重命名（防止不同用户上传相同文件名称到OSS，会发生文件覆盖的情况）
            String realName = uuid + fileType;//x2d2f5fd52dv2dv5df555df8322.jpg

            //构建OSS对象，用来推文件到OSS
            OSS oss = new OSSClientBuilder().build(BaseConstants.ENDPOINT, BaseConstants.ACCESS_KEY, BaseConstants.SECRET_KEY);
            /**
             * 开始构建文件对象
             * 参数1：指定你要把文件存放到哪个Bucket
             * 参数2：指定文件名称
             * 参数3：将文件以流的方式上传
             */
            PutObjectRequest putObjectRequest = new PutObjectRequest(BaseConstants.BUCKET_NAME, realName, file.getInputStream());
            //将文件对象推到OSS
            oss.putObject(putObjectRequest);
            //关闭资源
            oss.shutdown();//关闭OSSClient

            //4、文件上传完毕，拼接文件在OSS中的访问全路径，返回前端，此路径需要存数据库
            String fileFullPath = "https://" + BaseConstants.BUCKET_NAME + "." + BaseConstants.ENDPOINT + "/" + realName;

            //5、封装返回结果数据
            Map<String, String> fileInfo = new HashMap<>();
            fileInfo.put("fileName", realName);//文件名称（方便后面做删除文件操作）
            fileInfo.put("fileFullPath", fileFullPath);//文件全路径

            //6、返回数据
            return JSONResult.success(fileInfo);
        } catch (IOException e) {
            e.printStackTrace();
            return JSONResult.error("文件上传失败");
        }
    }

    @Override
    public JSONResult fileDelete(String fileName) {
        //构建OSS对象，用来推文件到OSS
        OSS oss = new OSSClientBuilder().build(BaseConstants.ENDPOINT, BaseConstants.ACCESS_KEY, BaseConstants.SECRET_KEY);

        /**
         * 删除文件
         * 参数1：Bucket名称
         * 参数2：文件名称（非全路径）
         */
        oss.deleteObject(BaseConstants.BUCKET_NAME, fileName);

        //返回结果
        return JSONResult.success();
    }
    /**
     * 将MultipartFile转换为File
     * @param multiFile
     * @return
     */
    public static File MultipartFileToFile(MultipartFile multiFile) {
        // 获取文件名
        String fileName = multiFile.getOriginalFilename();
        // 获取文件后缀
        String prefix = fileName.substring(fileName.lastIndexOf("."));
        // 若须要防止生成的临时文件重复,能够在文件名后添加随机码

        try {
            File file = File.createTempFile(fileName, prefix);
            multiFile.transferTo(file);
            return file;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}